package com.xiaoshuidi.cloud.module.contract.util.pdf;

import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;

import java.util.ArrayList;
import java.util.List;

public class PdfKeyWordUtil {
    public static List findKeywordItems(KeyWordRenderListener renderListener, String keyword) {
//先判断本页中是否存在关键词
        List<MatchItem> allItems = renderListener.getAllItems();//所有块LIST
        StringBuffer sbtemp = new StringBuffer("");
        for (MatchItem item : allItems) {//将一页中所有的块内容连接起来组成一个字符串。
            sbtemp.append(item.getContent());
        }
        if (sbtemp.toString().indexOf(keyword) == -1) {//一页组成的字符串没有关键词，直接return
            return renderListener.getMatches();
        }
//第一种情况：关键词与块内容完全匹配的项
        List matches = renderListener.getMatches();
//第二种情况：多个块内容拼成一个关键词，则一个一个来匹配，组装成一个关键词
        sbtemp = new StringBuffer("");
        List tempItems = new ArrayList();
        for (MatchItem item : allItems) {
//1，关键词中存在某块 2，拼装的连续的块=关键词 3，避开某个块完全匹配关键词
//关键词 中国移动 而块为 中 ，国，移动
//关键词 中华人民 而块为中，华人民共和国 这种情况解决不了，也不允许存在
            if (keyword.indexOf(item.getContent()) != -1 && !keyword.equals(item.getContent())) {
                tempItems.add(item);
                sbtemp.append(item.getContent());
                if (keyword.indexOf(sbtemp.toString()) == -1) {//如果暂存的字符串和关键词 不再匹配时
                    sbtemp = new StringBuffer(item.getContent());
                    tempItems.clear();
                    tempItems.add(item);
                }
                if (sbtemp.toString().equalsIgnoreCase(keyword)) {//暂存的字符串正好匹配到关键词时
                    MatchItem tmpitem = getRightItem(tempItems, keyword);
                    if (tmpitem != null) {
                        matches.add(tmpitem);//得到匹配的项
                    }
                    sbtemp = new StringBuffer("");//清空暂存的字符串
                    tempItems.clear();//清空暂存的LIST
                    continue;//继续查找
                }
            } else {//如果找不到则清空
                sbtemp = new StringBuffer("");
                tempItems.clear();
            }
        }
//第三种情况：关键词存在块中
        for (MatchItem item : allItems) {
            if (item.getContent().indexOf(keyword) != -1 && !keyword.equals(item.getContent())) {
                matches.add(item);
            }
        }
        return matches;
    }

    public static MatchItem getRightItem(List<MatchItem> tempItems, String keyword) {
        for (MatchItem item : tempItems) {
            if (keyword.indexOf(item.getContent()) != -1 && !keyword.equals(item.getContent())) {
                return item;
            }
        }
        return null;
    }
    public static List matchPage(PdfReader reader, Integer pageNumber, String keyword) throws Exception {
        KeyWordRenderListener renderListener = new KeyWordRenderListener();
        renderListener.setKeyword(keyword);
        PdfReaderContentParser parse = new PdfReaderContentParser(reader);
        Rectangle rectangle = reader.getPageSize(pageNumber);
        renderListener.setPageNumber(pageNumber);
        renderListener.setCurPageSize(rectangle);
        parse.processContent(pageNumber, renderListener);
        return findKeywordItems(renderListener,keyword);
    }
    public static void main(String[] args) throws Exception {
        String url="F:\\a.pdf";
//        String url="https://extapi.fadada.com/api2//getdocs.action?app_id=000950&timestamp=20230908091227&v=2.0&msg_digest=OUYyOURGMjI4NEVGOTAyMUY5MjA4MDQyMkQ5ODE3QzdCNTA1NURBMg==&transaction_id=JFQY_38987_2023090800002&send_app_id=null";
       // String keyword="乙方（签字）:";
       // String keyword="乙方（签字）：";
        //String keyword="乙方（签字）";
        String keyword="乙方（签字";
        //乙方（签字）：
        List items = new ArrayList();
        PdfReader reader = new PdfReader(url);
        int pageSize = reader.getNumberOfPages();
        for(int page = 1;page <= pageSize;page++){
            items.addAll(matchPage(reader,page,keyword));
        }
        System.out.println(items);
    }
}
